home *** CD-ROM | disk | FTP | other *** search
/ The Atari Compendium / The Atari Compendium (Toad Computers) (1994).iso / files / prgtools / programm.ing / m2gem106.lzh / CRYSTAL1.06 / CMP / LPRM2 / HK / FIXREAL / PATCH.TXT < prev   
Encoding:
Text File  |  1992-09-08  |  6.5 KB  |  140 lines

  1.   LPR-Modula hat ja einige Fehler, besonders bei den Bibliotheken, aber
  2.   ärgerlich sind die Fehler im Laufzeitsystem, weil man sich hierfür nicht
  3.   einfach ein neues Modul schreiben kann (geht schon, ist aber aufwendig, da
  4.   in Assembler). Bisher sind mir fünf Fehler im Zusammenhang mit der
  5.   (LONG)REAL-Arithmetik aufgefallen, die mit dem hier beschriebenen Patch-
  6.   Programm auch beseitigt werden können, als da wären:
  7.  
  8.   - Die LONGREAL-Division arbeitet nicht mit der erforderlichen
  9.     Genauigkeit (ca. 10 statt 16 Dezimalstellen). Das hat nicht
  10.     nur auf die eigentliche Division Einfluß, sondern auch auf die
  11.     Verarbeitung von LONGREAL-Konstanten durch den Compiler, denn
  12.     bei der Umwandlung der Zeichenketten in die interne Darstellung
  13.     als 8-Byte-Wert wird ebenfalls die LONGREAL-Division benötigt.
  14.  
  15.   - Die Konvertierung von LONGREAL zu REAL arbeitet nicht immer
  16.     korrekt (Bei der Rundung wird ein Mantissenüberlauf nicht
  17.     richtig behandelt), hierfür ist die Funktion SHORT in der LONGREAL-
  18.     Variante zuständig. Hier kann es vorkommen, daß eine Zahl mit
  19.     ausschließlich Neunen in der Mantisse nicht auf die nächsthöhere Zahl
  20.     aufgerundet wird, sondern auf das eineinhalbfache.
  21.     Dies betrifft aber genauso REAL-Konstanten, denn diese werden vom
  22.     Compiler als LONGREAL-Konstanten eingelesen und dann erst mit
  23.     SHORT nach REAL konvertiert.
  24.  
  25.   - Bei LPR arbeiten ja die Standardfunktionen nicht mit CARDINAL
  26.     sondern mit INTEGER, sodaß auch TRUNC, FLOAT, TRUNCD und FLOATD
  27.     auf negative Zahlen angewendet werden können. Leider behandelt
  28.     FLOAT negative Zahlen nicht korrekt.
  29.  
  30.   - Die Standardfunktion TRUNCD meldet schon bei -2147483648.0D einen
  31.     Überlauf, obwohl dies eigentlich erst bei -2147483649.0D der Fall
  32.     wäre.
  33.  
  34.   - Der Vergleich zweier LONGREAL-Zahlen arbeitet nicht immer korrekt.
  35.     Es kann sein, dass eine Zahl, die größer ist als eine andere,
  36.     plötzlich für die kleinere gehalten wird. Das passiert, wenn
  37.     die beiden oberen Mantissenhälften übereinstimmen, und die eine
  38.     untere Mantissenhälfte, als Zweierkomplementzahl interpretiert,
  39.     negativ ist (also oberstes Bit gesetzt).
  40.  
  41.  
  42.  
  43.   Die fehlerhaften Routinen sitzen an zwei Stellen: Einmal im Modul
  44.   'System' und ein zweitesmal sitzt das komplette Modul 'System' im Modul
  45.   'M2Shell'. 'M2Shell' ist für die Laufzeitunterstützung nicht `gelinkter'
  46.   Programme und den Compiler zuständig, 'System' ist lediglich für die
  47.   Laufzeitunterstützung `gelinkter' Programme zuständig. Es müssen also
  48.   beide Module korrigiert werden. Dazu ersetzt das Programm 'PATCH.TOS'
  49.   die fehlerhaften Routinen in beiden Modulen durch neue (die hoffentlich
  50.   fehlerfrei sind).
  51.  
  52.   Das Programm ist ziemlich unkomfortabel, aber da es wohl nur einmal
  53.   benutzt wird, habe ich mir eine großartige Benutzeroberfläche (...dieses
  54.   Wort: ist das nun die Oberfläche des Benutzers, also die Haut, oder was...)
  55.   Am besten geht man nach folgendem Rezept vor:
  56.  
  57.  
  58.   1. PATCH.TOS, M2SHELL.OBM und SYSTEM.OBM in ein gemeinsames Verzeichnis
  59.      kopieren (z.B. das Wurzelverzeichnis, nicht das Verzeichnis nehmen,
  60.      in dem die Originalmodule stehen, sicher ist sicher... )
  61.  
  62.   2. Das Programm starten
  63.  
  64.   3. Auf die Frage, welches der Module gepatcht werden soll, mit '1' oder
  65.      '2' antworten
  66.  
  67.   4. Auf die Frage, welche Routinen gepatcht werden sollen, mit '6' (alle
  68.      Routinen) antworten
  69.  
  70.  
  71.   Auf dem Bildschirm erscheinen Meldungen, welche Routinen gerade gepatcht
  72.   wurden.
  73.  
  74.  
  75.   5. Auf die Frage, ob weitergemacht werden soll, mit 'j' antworten
  76.  
  77.   6. Schritte 3 und 4 für das andere Modul wiederholen. Die Frage bei
  78.      Schritt 5 mit einem 'Return' beantworten
  79.  
  80.  
  81.   Wer schon bei HK_LIB_1.1 einen Patch vorgenommen hat, nimmt sich nun
  82.   entweder wieder eine Kopie der Originalmodule vor oder patcht die
  83.   Routinen FCMPd und TRUNCd einzeln.
  84.  
  85.   Folgende Fehler können auftreten, wobei das Programm nach einer Meldung
  86.   mit einem Tastendruck abgebrochen wird:
  87.  
  88.    - Die zu patchenden Module befinden sich nicht im gleichen Verzeichnis
  89.      oder sind schreibgeschützt.
  90.  
  91.    - Die Module wurden schon gepatcht oder liegen in einer anderen Version
  92.      vor (in diesem Fall müssten die Offset-Konstanten in PATCH.MOD
  93.      entsprechend geändert werden, was allerdings voraussetzt, daß die
  94.      Positionen der entsprechenden Routinen in SYSTEM.OBM und die Position
  95.      von SYSTEM.OBM innerhalb von M2SHELL.OBM gesucht werden. Sollte mal
  96.      eine neue Version von LPR-Modula erscheinen, werde ich die Konstanten
  97.      entsprechend ändern).
  98.  
  99.    - Ein Fehler bei der Dateibearbeitung.
  100.  
  101.  
  102.   Hinweis für Benutzer der auf Sammeldisk #1 (ST 285) enthaltenen Module
  103.   für LPR-Modula: Die Module 'RealInOut' und 'LongMathLib0' benutzen zur Ver-
  104.   meidung der Fehler, die bei LONGREAL-Division und -Konstanten entstehen, die
  105.   Prozeduren "Rec" und "Long" bzw. begnügen sich mit REAL-Konstanten.
  106.   Dies führt bei einer korrekten LONGREAL-Division erneut zu Ungenauigkeiten,
  107.   sodaß in den beiden Modulen am besten sämtliche Aufrufe von "Long" und
  108.   ersatzweise Verwendungen von REAL-Konstanten durch richtige LONGREAL-
  109.   Konstanten ersetzt werden, und sämtliche Vorkommen von Multiplikationen
  110.   mit der Funktion "Rec" - also z.B.  x * Rec(y) - durch Divisionen ersetzt
  111.   werden - im Beispiel also: x / y .
  112.   Soweit ich das ausprobiert habe, reicht es im Modul 'RealInOut' auch
  113.   folgendes zu tun (aber bitte nur als Notbehelf):
  114.  
  115.   Im Initialisierungsteil des Moduls (ziemlich am Ende der Datei) gibt es
  116.   eine Zuweisung
  117.  
  118.     E14:=1.0E14;
  119.  
  120.   Diese ist durch
  121.  
  122.     E14:=1.0D14;
  123.  
  124.   zu ersetzen. Das reicht anscheinend schon für korrekte Ergebnisse; sicherer
  125.   ist es aber auf alle Fälle, sämtliche `Hilslösungen' in der oben angegebenen
  126.   Weise zu ersetzen. Bei 'LongMathLib0' habe ich bisher nicht ausprobiert, ob
  127.   es auch hier reicht, nur bestimmte Werte oder Anweisungen zu ersetzen.
  128.  
  129.   Bei der Anpassung sollten die Hinweise für LONGREAL-Konstanten in
  130.   LPR_M2.TXT: "LONG-Konstanten" beachtet werden. Statt negativer Konstanten
  131.   werden z.B. positive deklariert, die dann bei der Anwendung mit negativem
  132.   Vorzeichen benutzt werden, bzw. subtrahiert statt addiert werden.
  133.  
  134.   !! Es kann sein, daß sich der Quelltext PATCH,MOD nicht mehr zum erneuten
  135.   Übersetzen bzw. Linken eignet, da sich die Schnittstellen zur HK_LIB geändert
  136.   haben, und der Quelltext nicht angepasst wurde (reine Faulheit); wer also
  137.   das ganze unbedingt neu übersetzen will, muß die Aufrufe der HK_LIB
  138.   im Quelltext erst entsprechend ändern.
  139.  
  140.